\section{DSL}
{\em DSL}，
数据集及快照层负责维护各对象集之间关系，
以及它们各自的属性，
向用户提供各个对象集的呈现。
ZFS对象集可以有如下几种呈现，
文件系统、克隆、快照，以及卷。

\subsection{结构}
每一个DMU对象集在DSL这一层有一个代理，
称为数据集（{\em Dataset}）。
这个代理负责对象集使用空间统计、
定位对象集、
以及维护对象集各个快照之间的内部依赖。

所有对象集被组织为多个集合，
称为数据集目录（{\em Dataset Directory}），
一个数据集目录管理一组相关的数据集以及它们的属性，
某个时刻，
一个数据集目录仅有一个活跃的数据集，
该目录下的其它数据集通过快照、克隆、或父子关系与活跃数据集相关联。

\subsection{DSL实现细节}
具体地说，
DSL实现为\verb|DMU_OST_META|类型对象集（即{\em MOS，Meta Object Set}），
一个存储池对应唯一的MOS，
如图\,\ref{fig:label}\,所示，
MOS由存储池的uberblock描述。
\begin{figure}[ht]
  \centering
  \includegraphics[width=\textwidth]{label.pdf}
  \caption{Label、Uberblock及MOS}\label{fig:label}
\end{figure}

\begin{figure}[ht]
  \centering
  \includegraphics[width=\textwidth]{dsl.pdf}
  \caption{DSL组织结构}\label{fig:dsl}
\end{figure}

与DMU层对象集一样，
MOS的描述子（即\verb|os_meta_dnode|）域类型为\verb|DMU_OT_DNODE|，
表明其描述的数据块中存储的是dnode对象，
MOS dnode数组的第二个元素固定用作{\em Object Directory}，
其类型为\verb|DMU_OT_OBJECT_DIR|-\verb|ECTORY|，
用于描述存储池唯一的{\em Root Dataset}，
其中\verb|root_dataset|域指明Root Dataset在dnode数组中的位置。
检索一个指定名字的数据集自Root Dataset开始逐级开始，
如图\,\ref{fig:dsl}\,所示，
全过程按如下步骤进行：

\begin{enumerate}
  \item Root Dataset的dnode对象的\,\verb|dd_child_dir_zapobj|域指示%
    其子目录{\em DSL Child Directory}在dnode数组中的位置；
  \item 由DSL Child Directory的ZAP对象可以检索指定名字的数据集目录在dnode数组中的位置；
  \item 读出类型为\verb|DMU_OT_DSL_DIR|的数据集目录对象，
    其\,\verb|dd_head_dataset|-\verb|_obj|域指示了该目录下当前活跃的数据集在dnode数组中位置；
  \item 在上一步得到的位置读出一个当前活跃数据集的dnode，
    这个dnode类型为\verb|DMU_OT_DSL_OBJSET|，
    它包含一个\verb|dsl_dataset_phys_t|结构，
    该结构的\verb|ds_bp|指向了DMU层的一个\verb|objset_phys_t|结构，
    从此，检索进入DMU层，
    在对象集中检索一个对象及其数据块详见上一节图\,\ref{fig:objset_ind}。
\end{enumerate}
